#include <unistd.h>
#include "stdio.h"
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"

#define LED_GPIO 9  // GPIO9 控制LED
#define BUTTON_GPIO 5  // GPIO5 连接按钮

static void ButtonLedTask(void *arg)
{
    (void)arg;
    
    // 初始化LED GPIO (输出模式)
    IoTGpioInit(LED_GPIO);
    IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
    
    // 初始化按钮 GPIO (输入模式)
    IoTGpioInit(BUTTON_GPIO);
    hi_io_set_pull(BUTTON_GPIO, HI_IO_PULL_UP);  // 启用上拉电阻
    hi_io_set_func(BUTTON_GPIO, HI_IO_FUNC_GPIO_5_GPIO);
    IoTGpioSetDir(BUTTON_GPIO, IOT_GPIO_DIR_IN);
    
    uint8_t lastButtonState = 1;  // 默认上拉状态为高电平(1)
    uint8_t ledState = 0;         // LED初始状态: 关闭
    
    while (1) {
        // 读取按钮状态 (0=按下, 1=释放)
        uint8_t buttonState;
        IoTGpioGetInputVal(BUTTON_GPIO, &buttonState);
        
        // // 检测按钮按下事件 (下降沿)
        // if (lastButtonState == 1 && buttonState == 0) {
        //     // 切换LED状态
        //     ledState = !ledState;
        //     IoTGpioSetOutputVal(LED_GPIO, ledState);
            
            // 添加去抖延时
            // usleep(20000);  // 20ms
        // }
            if (buttonState == 1) {
            // 切换LED状态为关闭
            ledState = 0;
            IoTGpioSetOutputVal(LED_GPIO, ledState);
            
            // 添加去抖延时
            usleep(20000);  // 20ms
        }
        else{
            // 切换LED状态为打开
            ledState = 1;
            IoTGpioSetOutputVal(LED_GPIO, ledState);
            
            // 添加去抖延时
            usleep(20000);  // 20ms
        }
        
        lastButtonState = buttonState;
        usleep(10000);  // 10ms检测间隔
    }
}

void ButtonLedDemo(void)
{
    osThreadAttr_t attr = {
        .name = "ButtonLedTask",
        .attr_bits = 0U,
        .cb_mem = NULL,
        .cb_size = 0U,
        .stack_mem = NULL,
        .stack_size = 1024,  // 适当增加栈大小
        .priority = osPriorityNormal,
    };

    if (osThreadNew((osThreadFunc_t)ButtonLedTask, NULL, &attr) == NULL) {
        printf("[ButtonLed] Failed to create task!\n");
    }
}

SYS_RUN(ButtonLedDemo);